package dao;

import javax.persistence.PersistenceException;
import javax.persistence.Query;

import model.Client;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Transactional;

public class ClientDao extends AbstractDao<Client> {

	public static Logger log =Logger.getLogger(ClientDao.class);
	
	public Client connect(String user, String password) {
		log.info("Recherche de l'utilisateur");
		Query query = getEm().createQuery("from Client c where c.login = :login");
		query.setParameter("login", user);
		Client client = (Client) query.getSingleResult();
		return client;
	}
	
	public Client searchClientByLogin(String login) {
		Client client = null;
		Query query = getEm().createQuery("from Client c where c.login = :login");
		query.setParameter("login", login);
		try {
			client = (Client) query.getSingleResult();
		}catch(PersistenceException e){
			log.info("Pas de client existant pour l'user"+login);
		}
		return client;
	}
	
	public Boolean exists(String login){
		log.info("Recherche d'un utilisateur existant");
		Client client = searchClientByLogin(login);
		if (client==null) {
			return false;
		} else{
			log.warn("Un utilisateur est déjà existant pour l'id:"+login);
			return true;
		}
	}
	
	@Transactional
	public Boolean save(String login, String password){
		log.info("Recherche d'un utilisateur existant");
		Client client = null;
		Query query = getEm().createQuery("from Client c where c.login = :login");
		query.setParameter("login", login);
		try {
			client = (Client) query.getSingleResult();
		} catch(PersistenceException e) {
			log.info("Pas de client existant pour l'user"+login);
		}
		if (client==null) {
			client=new Client();
			client.setLogin(login);
			client.setPassword(password);
			em.persist(client);
			em.flush();
			return true;
		} else {
			log.warn("Un utilisateur est déjà existant pour l'id:"+login);
			return false;
		}
	}
	
	@Transactional
	public Boolean update(Client user){
		log.info("Mise à jour de l'utilisateur");
		try {
			em.merge(user);
		} catch (Exception e) {
			log.error("Echec de la mise à jour de l'utilisateur");
			return false;
		}
		return true;
	}

}
